А дальше нужно делать класс. Вот такой например. Основная работа по перегрузки всяких там операторов. Мы перегрузим сложение.
// MathInt.h: interface for the CMathInt class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_MATHINT_H__BFCF903D_DFBA_45D9_984C_BE9DD0413545__INCLUDED_)
#define AFX_MATHINT_H__BFCF903D_DFBA_45D9_984C_BE9DD0413545__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CMathInt
{
public:
CMathInt(int xx);
virtual ~CMathInt();
int operator+(int y);
private:
int x;
};
#endif // !defined(AFX_MATHINT_H__BFCF903D_DFBA_45D9_984C_BE9DD0413545__INCLUDED_)
Его реализация
// MathInt.cpp: implementation of the CMathInt class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MathInt.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMathInt::CMathInt(int xx)
{
x=xx;
}
CMathInt::~CMathInt()
{
}
int CMathInt::operator+(int y)
{
int k=0; // флаг переполнения
int z=x;
_asm
{
pushf // сохраняем флаги
push ecx // сохраняем регистр который будем использовать
mov ecx,dword ptr [z] // из переменной в регистр
add ecx,dword ptr [y] // складываем
mov dword ptr [z],ecx // результат назад
jo overflow // переход по переполнению
jmp endover; // небыло переполнения
overflow: // переполнение
mov dword ptr [k],1 // установим флаг
endover:
pop ecx // востановить регистр
popf // востановить флаги
}
if (k==1) throw("Overflow ");
x=z;
return x;
}
А теперь попробуем использовать.
#include "MathInt.h"
void main()
{
CMathInt ci(2147483646);
int i;
i= ci+1;
cout << i << endl;
}
Сейчас все нормально.

Прибавим число побольше.
i= ci+4;
Вот, что и требовалось.
